import java.sql.ResultSet;
import java.util.Arrays;

//自己实现一个顺序表，并且实现顺序表的增删查改等功能
public class MyArrayList {
    private int size;
    private int[] arr;
    private int capacity;
    //无参版本空间默认为10
    public MyArrayList(){
        this.size = 0;
        this.arr = new int[10];
    }
    //有参版本可以设置初始长度
    public MyArrayList(int capacity){
        this.size = 0;
        this.arr = new int[capacity];
    }
    //尾插
    public void add(int value){
        //检查空间是否足够，不足则扩容
        if(size == capacity){
            this.addSpace();
        }
        this.arr[size] = value;
        this.size++;
    }
    //指定位置插入
    public void add(int index, int value){
        //检查空间是否足够，不足则扩容
        if(size == capacity){
            this.addSpace();
        }
        this.arr[index] = value;
        this.size++;
    }
    //扩容
    private void addSpace(){
        //先创建一个新的顺序表
        int[] newArr = new int[(int)(this.arr.length*1.5)];
        for(int i = 0; i < size; i++){
            newArr[i] = this.arr[i];
        }
        this.arr = newArr;
        this.capacity = this.arr.length;
    }
    //打印顺序表
    @Override
    public String toString() {
        StringBuilder str = new StringBuilder("{ ");
        for (int i = 0; i < size; i++) {
            str.append(arr[i]);
            if(i < size - 1){
                str.append(",");
            }
        }
        str.append(" }");
        return str.toString();
    }

    //按照元素删除
    public void delete(int val){
        //遍历数组
        for(int i = 0; i < size; i++){
            if(arr[i] == val){
                remove(i);
                return;
            }
        }
        System.out.println("没有找到该数据");
    }

    //按照下标删除
    public int remove(int index){
        int result = 0;
        //出现越界输入
        if(index < 0 || index >= this.size){
            throw new IndexOutOfBoundsException("输入的下标有误，该位置没有数据");
        }else {
             result = this.arr[index];
            for(int i = index; i < size - 1; i++){
                this.arr[i] = this.arr[i+1];
            }
            this.size--;
        }
        return result;
    }
    //查看一个数据是否存在顺序表中
    public boolean contains(int val){
        for(int i = 0; i < size; i++){
            if(arr[i] == val){
                return true;
            }
        }
        return false;
    }

    //获取元素个数
    public int getSize(){
        return this.size;
    }

    //清空顺序表
    public void clear(){
        //这里不能写arr=null，这样的话会使得顺序表无法再次使用，只能重新创建顺序表
        this.size = 0;
    }

    //从前往后查找元素所在位置
    public int indexOf(int val){
        for(int i = 0; i < size; i++){
            if(arr[i] == val){
                return i;
            }
        }
        return -1;
    }

    //从后往前查找元素所在位置
    public int lastIndexOf(int val){
        for(int i = size - 1; i >= 0; i--){
            if(arr[i] == val){
                return i;
            }
        }
        return -1;
    }

    ///////////////////////测试代码//////////////////
    ///////////////////////////////////////////////
//    public static void test1(){
//        MyArrayList list = new MyArrayList();
//        list.add(1);
//        list.add(2);
//        list.add(3);
//        list.add(4);
//        list.add(5);
//        list.add(6);
//        list.add(7);
//        System.out.println(list);
//        int result = list.remove(1);
//        System.out.println(result);
//        System.out.println(list);
//    }

//    public static void test2(){
//        MyArrayList list = new MyArrayList();
//        list.add(1);
//        list.add(2);
//        list.add(3);
//        list.add(4);
//        list.add(5);
//        list.add(6);
//        list.add(7);
//        System.out.println(list);
//        list.delete(1);
//        list.delete(2);
//        list.delete(3);
//        list.delete(4);
//        list.delete(100);
//        System.out.println(list);
//    }

    public static void test3(){
        MyArrayList list = new MyArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        System.out.println(list);
        System.out.println(list.getSize());
        System.out.println(list.indexOf(2));
        System.out.println(list.indexOf(30));
        System.out.println(list.lastIndexOf(5));
        System.out.println(list.lastIndexOf(30));
//        System.out.println(list.contains(1));
//        System.out.println(list.contains(2));
//        System.out.println(list.contains(30));
        list.clear();
        System.out.println(list);
    }

    public static void main(String[] args) {
//        test1();
//        test2();
        test3();
    }
}
